package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import modelo.Requisicao;
import modelo.RequisicaoProduto;
import modelo.RequisicaoViagem;

public class RequisicaoDao extends GenericDao {

	final int REQUISICAO_TIPO_PRODUTO = 1;
	final int REQUISICAO_TIPO_VIAGEM = 2;
	
	public RequisicaoDao(Connection con) {
		super(con);
		// TODO Auto-generated constructor stub
	}

	public RequisicaoDao() {
		// TODO Auto-generated constructor stub
	}

	public void inserir(Requisicao requisicao) throws DaoException {
		// TODO Auto-generated method stub
		if (requisicao instanceof RequisicaoProduto) {
			try {
				RequisicaoProduto requisicaoProduto = (RequisicaoProduto)requisicao;
				String sql = "INSERT INTO requisicao(numero, nomePessoa, dataCadastro, ano, tipoRequisicao) VALUES(?,?,?,?,?)";
				PreparedStatement pSt = con.prepareStatement(sql);
				int i = 1;
				pSt.setInt(i++, requisicaoProduto.getNumero());
				pSt.setString(i++, requisicaoProduto.getNomePessoa());
				pSt.setDate(i++, new java.sql.Date( requisicaoProduto.getDataCadastro().getTime() ));
				pSt.setInt(i++, requisicaoProduto.getAno());
				pSt.setInt(i++, REQUISICAO_TIPO_PRODUTO);
				pSt.executeUpdate();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new DaoException(e);
			}
		} else if (requisicao instanceof RequisicaoViagem) {

		}
	}

	public Requisicao busca(int codRequisicao) throws DaoException {
		Requisicao requisicao = null;
		String sql = "SELECT * FROM requisicao WHERE numero = ?";
		try {
			PreparedStatement pSt = con.prepareStatement(sql);
			pSt.setInt(1, codRequisicao);
			
			ResultSet rs = pSt.executeQuery();
			if(rs.next()){
				if(rs.getInt("tipoRequisicao")== REQUISICAO_TIPO_PRODUTO){
					RequisicaoProduto requisicaoProduto = extrairRequisicaoProduto(rs);
					ItemRequisicaoDao itemRequisicaoDao = new ItemRequisicaoDao(con);
					requisicaoProduto.setItemsRequisicao(itemRequisicaoDao.buscaItemPorRequisicao(requisicaoProduto));
					requisicao = requisicaoProduto;
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DaoException(e);
		}
		
		
		return requisicao;
	}

	private RequisicaoProduto extrairRequisicaoProduto(ResultSet rs) throws SQLException {
		RequisicaoProduto requisicaoProduto = new RequisicaoProduto();
		requisicaoProduto.setNumero(rs.getInt("numero"));
		requisicaoProduto.setNomePessoa(rs.getString("nomePessoa"));
		requisicaoProduto.setDataCadastro(rs.getDate("dataCadastro"));
		requisicaoProduto.setAno(rs.getInt("ano"));
		return requisicaoProduto;
	}

	public Collection<Requisicao> lista() throws DaoException {
		Collection<Requisicao> requisicoes = new ArrayList<Requisicao>();
		try {
			String sql = "SELECT numero FROM requisicao";
			Statement st = con.createStatement();
			ResultSet rs = st.executeQuery(sql);
			while(rs.next()){
				requisicoes.add(busca(rs.getInt("numero")));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new DaoException(e);
		}
		return requisicoes;
	}

	public void remover(int numeroRequisicao) throws DaoException {
		// TODO Auto-generated method stub
		String sql = "DELETE FROM requisicao WHERE numero = ?";
		try {
			PreparedStatement pSt = con.prepareStatement(sql);
			pSt.setInt(1, numeroRequisicao);
			pSt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new DaoException(e);
		}
		
	}

}
